package com.projetosi.web.server.sistema.dao;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.projetosi.web.server.sistema.interfaces.IGenericDAO;
import com.projetosi.web.server.sistema.interfaces.IGenericObject;
import com.projetosi.web.server.sistema.objetos.Usuario;
import com.projetosi.web.server.sistema.persistencia.LerEscreveArquivo;
import com.projetosi.web.server.sistema.sistema.RepositorioDeDados;
/**
 * 
 * @author  Filipe Alencar, Felipe J. Cavalcanti, Rodrigo L. de Brito, Thiago Gonï¿½alves, Victor Hugo Arcelino.
 *
 */
public class UsuarioDAO implements IGenericDAO {

	private static RepositorioDeDados _repositorio = RepositorioDeDados.getInstance();
	File arquivo =  new File("usuarios.xml");



	/**
	 * Cadastra um novo usuario no sistema.
	 * @throws Exception 
	 */
	public void cadastrar(IGenericObject objeto) throws Exception{
		if(objeto instanceof Usuario){
			Usuario user = (Usuario) objeto;
			if(!LerEscreveArquivo.existeXml(arquivo)){
				_repositorio.getUsuarios().add(user);
				_repositorio.atualizarDados(arquivo);
			}else{
				List<Usuario> usuarios = _repositorio.carregarDados(arquivo);
				usuarios.add(user);
				_repositorio.atualizarDados(arquivo);
			}
		
	}

}

private boolean existeLogin(Usuario novoUsuario) throws Exception {
	List<Usuario> usuarios = null;
	if(!LerEscreveArquivo.existeXml(arquivo)){
		return false;

	}else{
		usuarios = _repositorio.carregarDados(arquivo);
	}

	for (Usuario usuario : usuarios){
		if (usuario.getLogin().equals(novoUsuario.getLogin())){
			return true;
		}
	}

	return false;
}

/**
 * Permite que o usuario altere seus dados.
 * @throws Exception 
 */
public void alterar(IGenericObject objeto) throws Exception {
	List<Usuario> users = null;
	if(objeto instanceof Usuario){
		Usuario usuarioAlterado = (Usuario) objeto;
		if(!LerEscreveArquivo.existeXml(arquivo)){
			users = _repositorio.getUsuarios();
		}else{
			users = _repositorio.carregarDados(arquivo);
		}
		for (int i = 0; i < users.size(); i++) {
			if(users.get(i).equals(usuarioAlterado)){ 
				users.set(i, usuarioAlterado);
				_repositorio.setUsuarios(users);
				_repositorio.atualizarDados(arquivo);
			}

		}
	}
}

/**
 * Deleta um usuario do sistema.
 * @throws Exception 
 */

@Override
public void deletar(IGenericObject objeto) throws Exception  {
	List<Usuario> usersCadastrados = null;
	if(!LerEscreveArquivo.existeXml(arquivo)){
		usersCadastrados = _repositorio.getUsuarios();
	}else{
		usersCadastrados = _repositorio.carregarDados(arquivo);
	}
	for(Iterator<Usuario> it = usersCadastrados.iterator(); it.hasNext();){
		Usuario user =  it.next();
		if(user.equals((Usuario)objeto)){
			it.remove();
			_repositorio.setUsuarios(usersCadastrados);
			_repositorio.atualizarDados(arquivo);
			return;
		}
	}

}

/**
 * Pesquisa um certo usuario cadastrado no sistema,a partir de uma certa chave.
 */
@Override
public List<IGenericObject> pesquisar(String filtro, String chave)
throws Exception {
	if(filtro == null || chave == null){
		throw new Exception("Especifique o filtro e a chave da pesquisa.");
	}
	if(filtro.trim().isEmpty() || chave.trim().isEmpty()){
		throw new Exception("Voce deve deve definir o filtro e a chave da pesquisa.");
	}
	if(filtro.equals("nome")){
		return pesquisarPorNomeIncompleto(chave);
	}else if(filtro.equals("nomeCompleto")){
		return pesquisarPorNomeCompleto(chave);
	}else if(filtro.equals("endereco")){
		return pesquisarPorEndereco(chave);
	}else if(filtro.equals("login")){
		return pesquisarPorLogin(chave);
	}else
		throw new Exception("Atributo inexistente");
}

/**
 * Pequisa todos os usuarios cadastrados no sistema.
 * @throws Exception 
 */
@Override
public List<IGenericObject> pesquisarTodos() throws Exception {
	List<Usuario> usersCadastrados = null;
	List<IGenericObject> resultado = new ArrayList<IGenericObject>();
	if(!LerEscreveArquivo.existeXml(arquivo)){
		usersCadastrados = _repositorio.getUsuarios();
	}else{
		usersCadastrados = _repositorio.carregarDados(arquivo);
	}
	if(! (usersCadastrados.isEmpty())){
		for(Usuario user: usersCadastrados){
			if(user instanceof Usuario){
				resultado.add(user);
			}
		}
	}
	return resultado;

}

/**
 * Pesquisa usuarios que tem em seu nome completo o subnome especificado.
 * @param nome Nome do usuaario.
 * @return Uma lista de usuarios que possuem o nome especificado na pesquisa.
 * @throws Exception 
 */

private List<IGenericObject> pesquisarPorNomeIncompleto(String nome) throws Exception{
	List<IGenericObject> usersCadastrados = pesquisarTodos();
	List<IGenericObject> resultado = new ArrayList<IGenericObject>();
	if(!usersCadastrados.isEmpty()){
		for (IGenericObject user : usersCadastrados) {
			if(((Usuario)user).getNome().contains(nome)){
				resultado.add(user);
			}
		}
	}
	return resultado;
}

/**
 * Pesquisa um usuario atraves de seu nome completo.
 * @param nome Nome completo do usario.
 * @return Uma lista com o usuario pesquisado.
 * @throws Exception 
 */
private List<IGenericObject> pesquisarPorNomeCompleto(String nome) throws Exception{
	List<IGenericObject> usersCadastrados = pesquisarTodos();
	List<IGenericObject> resultado = new ArrayList<IGenericObject>();
	if(!usersCadastrados.isEmpty()){
		for (IGenericObject user : usersCadastrados) {
			if(((Usuario)user).getNome().equalsIgnoreCase(nome)){
				resultado.add(user);
			}
		}
	}
	return resultado;
}

/**
 * Pesquisa usuario pelo login.
 * @param login O login do usuario.
 * @return Lista contendo o usuario pesquisado.
 * @throws Exception 
 */
private List<IGenericObject> pesquisarPorLogin(String login) throws Exception{
	List<IGenericObject> usersCadastrados = pesquisarTodos();
	List<IGenericObject> resultado = new ArrayList<IGenericObject>();
	if(!usersCadastrados.isEmpty()){
		for (IGenericObject user : usersCadastrados) {
			if(((Usuario)user).getLogin().equals(login)){
				resultado.add(user);
			}
		}
	}
	return resultado;
}

/**
 * Pesquisa usuarios pelo endereco.
 * @param nome Endereco do usuario.
 * @return Uma lista de usuarios que possuem o endereco especificado na pesquisa.
 * @throws Exception 
 */
private List<IGenericObject> pesquisarPorEndereco(String endereco) throws Exception{
	List<IGenericObject> usersCadastrados = pesquisarTodos();
	List<IGenericObject> resultado = new ArrayList<IGenericObject>();
	if(!usersCadastrados.isEmpty()){
		for (IGenericObject user : usersCadastrados) {
			if(((Usuario)user).getEndereco().contains((endereco))){ 
				resultado.add(user);
			}
		}
	}
	return resultado;
}
}